<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace Common\Api;
class ModelApi {
	/**
	 * 获取文档模型信息
	 * @param  integer $id    模型ID
	 * @param  string  $field 模型字段
	 * @return array
	 */
	public static function get_document_model($id = null, $field = null) {
		static $list;

		/* 非法分类ID */
		if (!(is_numeric($id) || is_null($id))) {
			return '';
		}

		/* 读取缓存数据 */
		if (empty($list)) {
			$list = S('DOCUMENT_MODEL_LIST');
		}

		/* 获取模型名称 */
		if (empty($list)) {
			$map = array('status' => 1, 'extend' => 1);
			$model = M('Model')->where($map)->field(true)->select();
			foreach ($model as $value) {
				$list[$value['id']] = $value;
			}
			S('DOCUMENT_MODEL_LIST', $list); //更新缓存
		}

		/* 根据条件返回数据 */
		if (is_null($id)) {
			return $list;
		} elseif (is_null($field)) {
			return $list[$id];
		} else {
			return $list[$id][$field];
		}
	}

	// 获取模型名称
	public static function get_model_by_id($id) {
		return $model = M('Model')->getFieldById($id, 'title');
	}

	/**
	 * 获取属性信息并缓存
	 * @param  integer $id    属性ID
	 * @param  string  $field 要获取的字段名
	 * @return string         属性信息
	 */
	public static function get_model_attribute($model_id, $group = true) {
		static $list;

		/* 非法ID */
		if (empty($model_id) || !is_numeric($model_id)) {
			return '';
		}

		/* 读取缓存数据 */
		if (empty($list)) {
			$list = S('attribute_list');
		}

		/* 获取属性 */
		if (!isset($list[$model_id])) {
			$map = array('model_id' => $model_id);
			$extend = M('Model')->getFieldById($model_id, 'extend');

			if ($extend) {
				$map = array('model_id' => array("in", array($model_id, $extend)));
			}
			$info = M('Attribute')->where($map)->select();
			$list[$model_id] = $info;
			//S('attribute_list', $list); //更新缓存
		}

		$attr = array();
		foreach ($list[$model_id] as $value) {
			$attr[$value['id']] = $value;
		}

		if ($group) {
			$sort = M('Model')->getFieldById($model_id, 'field_sort');

			if (empty($sort)) {
				//未排序
				$group = array(1 => array_merge($attr));
			} else {
				$group = json_decode($sort, true);

				$keys = array_keys($group);
				foreach ($group as &$value) {
					foreach ($value as $key => $val) {
						$value[$key] = $attr[$val];
						unset($attr[$val]);
					}
				}

				if (!empty($attr)) {
					$group[$keys[0]] = array_merge($group[$keys[0]], $attr);
				}
			}
			$attr = $group;
		}
		return $attr;
	}

	// 分析属性的枚举类型字段值 格式 a:名称1,b:名称2 或者 :fun(var1,var)
	public static function parse_field_attr($string) {
		if (0 === strpos($string, ':')) {
			// 采用函数定义
			return eval(substr($string, 1) . ';');
		}
		$array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
		if (strpos($string, ':')) {
			$value = array();
			foreach ($array as $val) {
				list($k, $v) = explode(':', $val);
				$value[$k] = $v;
			}
		} else {
			$value = $array;
		}
		return $value;
	}
}